<?php
namespace app\chatpay\controller;
use \app\admin\controller\Server;
use think\Request;
use think\Image;
class Wechatpay {
	public function pay() {
		$fee=input('price');
		$userid = input('userid');
		$user = Db('userinfo')->where('userid',$userid)->find();
		$appid='wx2be16458f583c87b';
		$body = '测试支付';
		$mch_id = '1578475901';
		$nonce_str = $this->nonce_str();
		$notify_url = 'server.entergo.top';
		$openid =$user['openid'];
		$out_trade_no = $this->order_number($openid);
		$spbill_create_ip = '39.106.175.194';
		$total_fee =    $fee*100;
		$trade_type = 'JSAPI';
		$post['appid'] = $appid;
		$post['body'] = $body;
		$post['mch_id'] = $mch_id;
		$post['nonce_str'] = $nonce_str;
		$post['notify_url'] = $notify_url;
		$post['openid'] = $openid;
		$post['out_trade_no'] = $out_trade_no;
		$post['spbill_create_ip'] = $spbill_create_ip;
		$post['total_fee'] = $total_fee;
		$post['trade_type'] = $trade_type;
		$sign = $this->sign($post);
		//签名
		$post_xml = '<xml>
					<appid>'.$appid.'</appid>
					<body>'.$body.'</body>
					<mch_id>'.$mch_id.'</mch_id>
					<nonce_str>'.$nonce_str.'</nonce_str>
					<notify_url>'.$notify_url.'</notify_url>
					 <openid>'.$openid.'</openid>
					 <out_trade_no>'.$out_trade_no.'</out_trade_no>
					 <spbill_create_ip>'.$spbill_create_ip.'</spbill_create_ip>
					 <total_fee>'.$total_fee.'</total_fee>
					 <trade_type>'.$trade_type.'</trade_type>
					 <sign>'.$sign.'</sign>
					 </xml>';
		$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
		$xml = $this->http_request($url,$post_xml);
		$array = $this->xml($xml);
		if($array['RETURN_CODE'] == 'SUCCESS' && $array['RESULT_CODE'] == 'SUCCESS') {
			$time = time();
			$tmp='';
			$tmp['appId'] = $appid;
			$tmp['nonceStr'] = $nonce_str;
			$tmp['package'] = 'prepay_id='.$array['PREPAY_ID'];
			$tmp['signType'] = 'MD5';
			$tmp['timeStamp'] = "$time";
			$data['state'] = 200;
			$data['timeStamp'] = "$time";
			$data['nonceStr'] = $nonce_str;
			$data['signType'] = 'MD5';
			$data['package'] = 'prepay_id='.$array['PREPAY_ID'];
			$data['paySign'] = $this->sign($tmp);
			$data['out_trade_no'] = $out_trade_no;
		} else {
			$data['state'] = 0;
			$data['text'] = "错误";
			$data['RETURN_CODE'] = $array['RETURN_CODE'];
			$data['RETURN_MSG'] = $array['RETURN_MSG'];
		}
		echo json_encode($data);
	}
	private function nonce_str() {
		$result = '';
		$str = 'QWERTYUIOPASDFGHJKLZXVBNMqwertyuioplkjhgfdsamnbvcxz';
		for ($i=0;$i<32;$i++) {
			$result .= $str[rand(0,48)];
		}
		return $result;
	}
	private function order_number($openid) {
		return md5($openid.time().rand(10,99));
	}
	private function sign($data) {
		$stringA = '';
		foreach ($data as $key=>$value) {
			if(!$value) continue;
			if($stringA) $stringA .= '&'.$key."=".$value; else $stringA = $key."=".$value;
		}
		$wx_key = 'F49BFAE0A1623F9A4AFAE98FC850092D';
		$stringSignTemp = $stringA.'&key='.$wx_key;
		return strtoupper(md5($stringSignTemp));
	}
	public function http_request($url,$data = null,$headers=array()) {
		$curl = curl_init();
		if( count($headers) >= 1 ) {
			curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
		}
		curl_setopt($curl, CURLOPT_URL, $url);
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
		if (!empty($data)) {
			curl_setopt($curl, CURLOPT_POST, 1);
			curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
		}
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
		$output = curl_exec($curl);
		curl_close($curl);
		return $output;
	}
	private function xml($xml) {
		$p = xml_parser_create();
		xml_parse_into_struct($p, $xml, $vals, $index);
		xml_parser_free($p);
		$data = "";
		foreach ($index as $key=>$value) {
			if($key == 'xml' || $key == 'XML') continue;
			$tag = $vals[$value[0]]['tag'];
			$value = $vals[$value[0]]['value'];
			$data[$tag] = $value;
		}
		return $data;
	}
}